#include <stdio.h>
#include <assert.h>
#include <string.h>
//模拟实现strlen
//遍历计数
size_t my_strlen1(const char* str)
{
    assert (str!=NULL);
    size_t count =0;
    while (*str!='\0')
    {
        count ++;
        str++;
    }
    return count;
}
//不使用临时变量，递归法
size_t my_strlen2(const char* str)
{
    if (*str=='\0')
        return 0;
    else
        return 1 + my_strlen2(str+1);
}

// int main ()
// {
//     char arr[]="abcdefg";
//     size_t len = my_strlen2 (arr);
//     printf ("%zd\n",len);
//     return 0;
// }

//模拟实现strcpy
char* my_strcpy (char* dest,const char* src)
{
    assert (dest && src);
    char* ret = dest;
    while ((*dest++ = *src++));
    return ret;
}
// int main ()
// {
//     char arr1[]="abcdefg";
//     char arr2[]="hijk";
//     printf ("%s\n",my_strcpy (arr1,arr2));
//     return 0;
// }


//模拟实现strcat
char * my_strcat (char* dest,const char* src)
{
    assert (dest && src);
    char* ret = dest;
    //找到目标函数的\0
    while (*dest)
        dest++;
    //拷贝
    // while (*src!='\0')
    // {
    //     *dest = *src;
    //     dest++;
    //     src++;
    // }
    while ((*dest++ = *src++));
    return ret;
}
// int main ()
// {
//     char arr1[20]="abcdefg";
//     char arr2[]="hijk";
    // printf ("%s\n",my_strcat (arr1,arr2));
//     return 0;
// }

//模拟实现strcmp

int my_strcmp(const char*s1,const char*s2)
{
    assert (s1 && s2);
    while (*s1==*s2)
    {
        if (*s1=='\0')
            return 0;
        s1++;
        s2++;
    }
    return *s1-*s2;
}
// int main ()
// {
//     char arr1[]="abcdefg";
//     char arr2[]="abcfff";
//     int ret = my_strcmp(arr1,arr2);
//     if (ret)
//         printf ("%d\n",ret);
//     return 0;
// }

//模拟实现strstr
const char* my_strstr (const char*str1,const char*str2)
{
    assert (str1 && str2);
    const char* cp=str1;
    const char* s1 =str1;
    const char* s2 =str2;
    //如果子字符串str2为空，直接返回str1,（特殊处理）
    if (*s2=='\0')
        return str1;
    while (*cp)
    {
        s1=cp;
        s2=str2;
        while (*s1==*s2 && s1)
        {
            s1++;
            s2++;
        }
        if (*s2=='\0')
            return cp;
        cp++;
    }
    return NULL;
}
// int main ()
// {
    // char arr1[]="abcdefg";
    // char arr2[]="cd";
//     const char* ret = my_strstr(arr1,arr2);
//     // char* ret = strstr(arr1,arr2);

//     if (ret)
//         printf ("%s\n",ret);
//     else
//         printf ("没找到\n");
//     return 0;
// }


//模拟实现strncpy
char* my_strncpy(char* dest,const char* src,size_t num)
{
    assert (dest && src);
    char* ret = dest;
    while (num--)
    {
        if (*src=='\0')
            *dest++='\0';
        else
            *dest++ = *src++;
    }
    return ret;
}

// int main ()
// {
//     char arr1[10]="abcdefg";
//     char arr2[]="hij";
//     printf ("%s\n",my_strncpy (arr1,arr2,5));
//     return 0;
// }

//模拟实现strncat
char * my_strncat (char* dest,const char* src,size_t num)
{
    assert (dest && src);
    char* ret = dest;
    //找到目标函数的\0
    while (*dest)
        dest++;
    //拷贝
    while (num--)
    {
        *dest++ = *src++;
        if (*src=='\0')
            break;
    }
    *dest='\0';
    return ret;
}
int main ()
{
    char arr1[20]="abcdefg";
    char arr2[]="hijk";
    printf ("%s\n",my_strncat (arr1,arr2,3));
    return 0;
}